package com.java.stack;

import java.util.Scanner;

/**
 * 用数组模拟栈
 */
public class ArrayStackDemo {

    public static void main(String[] args) {

        //先下架一个ArrayStack对象
        ArrayStack arrayStack = new ArrayStack(4);

        String key = "";
        boolean loop = true;//是否退出
        Scanner scanner = new Scanner(System.in);

        while (loop){
            System.out.println("show:表示显示栈");
            System.out.println("exit：退出程序");
            System.out.println("push：添加数据（入栈）");
            System.out.println("pop：从栈取出数据");

            System.out.println("请输入选择");
            key = scanner.next();

            switch (key){
                case "show":
                    arrayStack.list();
                    break;
                case "push":
                    System.out.println("请输入一个数");
                    int value = scanner.nextInt();
                    arrayStack.push(value);
                    break;
                case "pop":
                    try {
                        int res = arrayStack.pop();
                        System.out.println("出栈的数据是："+  res);
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;

                case "exit":
                    scanner.close();
                    loop = false; //退出
                    break;
            }
        }
        System.out.println("程序退出");
        System.out.println("程序退出");
        System.out.println("程序退出");

    }
}


//定义一个ArrayStack 表示栈
class ArrayStack{

    private int maxSize;//栈的大小
    private int[] stack;// 数组，数组模拟栈
    private int top = -1; //表示栈顶， 初始化为-1表示没有数据

    //构造器
    public ArrayStack(int maxSize){
        this.maxSize = maxSize;
        stack = new int[this.maxSize]; //初始化栈的大小
    }

    //栈满
    public boolean ifFull(){
        return top == maxSize - 1;//表示栈满
    }

    //栈空
    public boolean isEmpty(){
        return top == -1; //栈空
    }


    //入栈
    public void push(int value){
        //先判断栈是否满
        if (ifFull()){
            System.out.println("栈满");
            return;
        }
        top++;
        stack[top] = value;
    }


    //出栈：将栈顶的数据返回
    public int pop(){
        //先判断是否为空
        if (isEmpty()){
            throw new  RuntimeException("栈中没有数据,栈空");
        }

        int value = stack[top]; //栈顶数据
        top--;
        return value;
    }

    //遍历栈中的数据:从栈顶往下遍历
    public void list(){

        if (isEmpty()){
            System.out.println("栈中没有数据,栈空");
            return;
        }

        //从栈顶往下遍历
        for (int i = top ; i>=0 ; i--){
            System.out.println("栈中索引为"+i +"的数据为:"+stack[i]);
        }

    }



}
